home *** CD-ROM | disk | FTP | other *** search
/ ADA Programming Guide / ADA Programming Guide.iso / ada_gwu / readme.nyu < prev    next >
Text File  |  1996-01-30  |  24KB  |  552 lines

  1. This is the original NYU documentation for Ada/Ed.
  2.  
  3. 1. INTRODUCTION.
  4.  
  5. This file is the README file from the distribution of Ada/Ed version
  6. 1.11.2-PC, an Ada interpreter for 386/486 machines running MS-DOS/PC-DOS.
  7.  
  8. This program is free software; you can redistribute it and/or modify
  9. it under the terms of the GNU General Purpose License as published by
  10. the Free Software Foundation; either version 2 of the License, or
  11. (at your option) any later version. See relevant excerpts below.
  12.  
  13. Ada/Ed is a translator-interpreter for Ada. It is intended as a teaching
  14. tool, and does not have the capacity, performance,  or robustness of 
  15. commercial Ada compilers. Ada/Ed was developed at New York University, as
  16. part of a long-range project in language definition and software prototyping. 
  17. The project produced the first validated translator for Ada, in the form of
  18. an executable definition of the language written in SETL. The SETL system
  19. served as design document and prototype for the C version being released today.
  20.  
  21. Ada/Ed was last validated under version 1.7 of the ACVC tests. Therefore it is
  22. not currently a validated Ada system, and users can expect to find  small
  23. discrepancies between Ada/Ed and currently validated compilers. 
  24.  
  25. Apart from the 100-odd tests of ACVC 1.11 that Ada/Ed currently fails, the
  26. major deficiency of the system is that, being an interpreter, it does not 
  27. implement most representation clauses, and thus does not support systems 
  28. programming close to the machine level. 
  29.  
  30. We trust that even with these limitations, Ada/Ed will be of use to the
  31. Ada community at large: students, educators, user, and implementors. The 
  32. sources of the system should be of interest to compiler writers, and we hope 
  33. that they will encourage the construction of software tools to make the system
  34. more usable and polished. The NYUADA project does not have the resources to
  35. promise regular new maintenance releases of the software, but will do its
  36. best to keep track of reported errors, workarounds, and fixes. We will also
  37. produce at irregular intervals design notes and additional documentation on
  38. the front-end of the system.  We  urge users to send comments, corrections 
  39. and bug reports (reduced to their simplest form!)  to:   adaed@cs.nyu.edu
  40.  
  41.  
  42. All users of Ada/Ed are urged to register themselves by
  43. sending email to the above address, or to the NYUADA project, New
  44. York University, 251 Mercer Street, New York, NY 10012. This will allow us to
  45. notify users of updates and new releases of the system.
  46.  
  47.  
  48. 2. (UN) WARRANTY
  49.  
  50. This software is release 1.11.2-PC of the Ada/Ed system.
  51. It is distributed absolutely WITHOUT ANY WARRANTY; without even the implied 
  52. warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  53. General Public License for more details.
  54.  
  55. To receive a copy of the GNU General Public License write to the Free
  56. Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139.
  57.  
  58. The following is an excerpt from the GNU General Public License concerning
  59. warranties:
  60.  
  61. Because the program is licensed free of charge, there is no warranty
  62. for the program, to the extent permitted by applicable law.  Except when
  63. otherwise stated in writing the copyright holders and/or other parties
  64. provide the program "as is" without warranty of any kind, either expressed
  65. or implied, including, but not limited to, the implied warranties of
  66. merchantability and fitness for a particular purpose.  The entire risk as
  67. to the quality and performance of the program is with you.  Should the
  68. program prove defective, you assume the cost of all necessary servicing,
  69. repair or cowriting
  70. will any copyright holder, or any other party who may modify and/or
  71. redistribute the program as permitted above, be liable to you for damages,
  72. including any general, special, incidental or consequential damages arising
  73. out of the use or inability to use the program (including but not limited
  74. to loss of data or data being rendered inaccurate or losses sustained by
  75. you or third parties or a failure of the program to operate with any other
  76. programs), even if such holder or other party has been advised of the
  77. possibility of such damages.
  78.  
  79. 3. INSTALLATION
  80.  
  81. To intall Ada/Ed choose a directory to contain the executables and
  82. library files; include this directory on the PATH; set the environment
  83. variable ADAED to the pathname for this directory; and copy the files
  84. *.exe, predef.axq, predef.trc, and predef.lib into the directory.
  85.  
  86. For example, if the directory chosen is C:\ADAED, then the AUTOEXEC.BAT
  87. might contain lines such as:
  88.  
  89. PATH=C:;C:\ADAED
  90. SET ADAED=C:\ADAED
  91.  
  92. If you already have a number of SET commands in your AUTOEXEC.BAT file
  93. then you might not be able to add the additional SET commands needed
  94. for Ada/Ed-C. If you have DOS 3.2 (or later) this can be overcome by 
  95. adding the following to your CONFIG.SYS file:
  96.      SHELL=C:\COMMAND.COM /P /E:320
  97. For DOS 3.2 the E: option tells DOS to allocate the specified number
  98. of bytes for the environment. The first argument points to a copy 
  99. of COMMAND.COM on the hard disk; adjust this if you do not keep
  100. COMMAND.COM in the root directory. This command also works (but is
  101. not doumented) under DOS 3.1, but for DOS 3.1, the argument is in
  102. paragraphs rather that bytes (so write /E:20 to get 320 bytes).
  103.  
  104. Before using the compiler you must make sure that your CONFIG.SYS file
  105. allows the system to open at least 12 files. Check this by looking in 
  106. your CONFIG.SYS file for the following line:
  107.      FILES=number
  108. If number is less that 12, edit the CONFIG.SYS and set number to a value 
  109. not less that 12. If you do not currently have a CONFIG.SYS file, create 
  110. a file of that name on your system disk (or root diectory if you boot from 
  111. a hard disk) and insert the following line:
  112.      FILES=12
  113.  
  114. Note that if the value of FILES is too small, you will get the message
  115. "Unable to open file ..." when compiling even the simplest program.
  116.  
  117. You may also want to use the BUFFERS command to specify a larger number of
  118. buffers. This is not required, but specifying more that the default number
  119. of buffers should substantially improve Ada/Ed-C performance. A minimum 
  120. value of 15 is recommended, so add
  121.      BUFFERS=15
  122. to your CONFIG.SYS file. A value larger than 15 will further increase 
  123. performance, however it might begin to decrease the size of programs that
  124. can be compiled by decreasing the available memory.
  125.  
  126. Try some of the supplied demo program (see the readme in the demos directory)
  127. Also look at the release.notes for more information about the system and
  128. the changes that have take place.
  129.  
  130. 4. REBUILDING
  131.  
  132. Ada/Ed is written in C, and built using Intel's 386/486 C Code Builder.  
  133. The sources and makefile for doing this are part of the distribution.  To
  134. rebuild, read the makefile and execute "make" and "make predef.lib" or
  135. just "make predef.lib".  In particular, note the comment in the makefile
  136. about the include file makeext.  After rebuilding, follow the installation
  137. instructions above.
  138.  
  139.  
  140. 5. USING Ada/Ed
  141.  
  142. The Ada/Ed system includes the following commands:
  143.  
  144.  adacomp     [ -abgsv ] [ -m  main_unit ] [ -n ] [-l library ]  file
  145.  
  146.  adabind     [ -m  main_unit ]  [-l library]
  147.  
  148.  adaexec     [ -h heap] [ -m   bound_main_unit ] [-p pstack] [-s  tstack]
  149.              [ -r nb_stmts] [ -t [acerst] ]   [-l library]
  150.  
  151.  adalib      [-l library]
  152.  
  153. Description
  154.  
  155. Ada/Ed is a translator/interpreter for the Ada programming language that
  156. is intended primarily for educational use.
  157.  
  158. Adacomp compiles an Ada program; it invokes in succession the two
  159. compilation phases: parsing and semantic analysis (the front end) ,and 
  160. code generation.  The file argument refers to the source file; if no 
  161. extension is given for it, the extension ADA is assumed. The file argument 
  162. may contain drive and directory specifications.  The output of the compiler 
  163. is an instruction stream for an abstract Ada machine, which is then 
  164. interpreted.
  165.  
  166. Adabind binds a given library with the specified main unit to form an
  167. executable program.
  168.  
  169. Adaexec invokes the Ada machine interpreter for the bound program given in 
  170. the specified library. 
  171.  
  172. Adalib displays the contents of the specified library.
  173.  
  174. Note :  All options must precede the file name and may be in either lower or
  175.         upper case.
  176.  
  177. Program Library
  178.  
  179. All compilations require a library. A library is a directory, which is
  180. created or reinitialized when the user invokes a command containing a -n
  181. option such as:
  182.  
  183.     adacomp   -n  -l  libname   adafile
  184.  
  185. Intermediate files appear in directory libname. This directory is created by
  186. the command if it does not already exist. Only the listing files are created
  187. in acomp command (i.e. those
  188. produced by the Ada/Ed system); confusion and grief may result if you attempt
  189. to use a library directory to hold other files. The libname argument may
  190. contain drive and path specifications.
  191.  
  192. The libname argument can be omitted if the environment variable ADALIB is
  193. defined. For example, if you are doing several compilations referring to
  194. the same library you can use the command
  195.         SET  ADALIB=C:\MYLIB
  196. to indicate the library to be used. In this way the -l option (including
  197. its library name argument) to adacomp, adabind, adaexec and adalib can be 
  198. omitted.
  199.  
  200. A given utility library UL (e.g. one that contains mathematical functions)
  201. may be used by several unrelated programs. It may then be convenient to
  202. create independent libraries for each program, and initialize each library
  203. with the contents of UL. This can be done simply by creating directories
  204. for each library, and copying the contents of UL into each of these, using
  205. DOS commands.
  206.  
  207.  
  208. Options
  209.  
  210. The options for adacomp are as follows:
  211.  
  212.  -a    Generates instructions for use by the interpreter (adaexec) to
  213.        trace the ada source lines, and is used in conjunction with the
  214.        -t a option of adaexec.  This is also necessary to get at run-time
  215.        the source line number at which an exception is raised.
  216.  
  217.  -b    Indicates that the binding of the library is to be performed if
  218.        the current compilation is completed without errors.
  219.  
  220.  -g    Specifies that the compiler is to produce a listing of the
  221.        generated instructions for the Ada machine (of little interest
  222.        to most users).
  223.  
  224.  -l library
  225.        Uses the specified library to satisfy references to compilation
  226.        units not present in the file being compiled. If the compilation
  227.        is successful, the units defined in the file are added to the
  228.        library. If  the -l option is not used, the environment symbol
  229.        ADALIB specifies the library.
  230.  
  231.  -m unit_name
  232.        Specifies the name of the unit which is to serve as a main unit.
  233.        When the library contains only one main program - which must be a
  234.        parameterless procedure - this option is not needed. This is an
  235.        option to the binder and is only relevant if the -b option is used.
  236.  
  237.  -n    Indicates that a new library is to be created for this compilation.
  238.        The name of the library is indicated by the -l option or by use of
  239.        the ADALIB environment symbol. The -n option must be specified if
  240.        the library referenced by the -l  option does not already exist or
  241.        if the user wants to reinitialize it.
  242.  
  243.  -s    Obtain a listing of the source file. The filename of the listing
  244.        file is the input file name with a filename extension of LST, and
  245.        is written in the directory from which the adacomp command is
  246.        invoked. By default a listing is not generated unless there are
  247.        warnings, errors or informational messages to report.
  248.  
  249.  -v    Give a descriptive trace showing the subsidiary programs invoked
  250.        by the adacomp command, the arguments passed to them, and their
  251.        exit status. This is used primarily for system checkout.
  252.  
  253.  
  254. The options for adabind are as follows:
  255.  
  256.  -l library
  257.        Specifies the library which together with the main unit will produce 
  258.        a bound program which can be executed by adaexec.  If  this option is
  259.        not specified explicitly, a default library is implicitly defined by
  260.        the environment symbol ADALIB.
  261.  
  262.  -m unit_name
  263.        Specifies the name of the unit which is to serve as a main unit.
  264.        When the library contains only one main program - which must be a
  265.        parameterless procedure - this option is not needed.
  266.  
  267.  
  268. The options for adaexec are as follows:
  269.  
  270.  -l library
  271.        Specifies the library which contains the bound program to be executed.
  272.        If this option is not specified explicitly, a default library is 
  273.        implicitly defined by the environment symbol ADALIB.
  274.  
  275.  -m unit_name
  276.       Specifies the name of the bound main unit, i.e. the main unit that
  277.       was specified to adabind or adacomp. Note that a given library may
  278.       have been bound several times with different main units. When the
  279.       library has been bound with only one main unit this option is not
  280.       needed.
  281.  
  282.  -h heap
  283.       Specifies the size of the heap increment in kilowords, by which the
  284.       heap is expanded when the elaboration of a new entity requires it.
  285.       The heap expands to fill available memory. The default increment is
  286.       32. This parameter limits the size of the largest object that can be
  287.       created in a program.
  288.  
  289.  -p pstack
  290.       Specifies the size in bytes of the program stack size for the main
  291.       task. The default is 4096. Argument values in the range 1..31 are
  292.       multiplied by 1024 to obtain the stack size in bytes. The maximum
  293.       value is 32767.
  294.  
  295.  -s tstack
  296.       Specifies the size in bytes of the stack size for each new task.
  297.       The default is 2048. Argument values in the range 1..31 are multiplied
  298.    programs with many tasks, each of
  299.       which can run with a small stack.  The maximum value is 32767.
  300.  
  301.  -r number_of_statements (an integer)
  302.       Invoke a 'round-robin' scheduling policy instead of the 'run-until-
  303.       -block' default scheduling policy and specify the maximum number of
  304.       interpreted statements that a given task can execute before switching 
  305.       to another task. (the minimum value is 1).
  306.  
  307.  -t [acerst]
  308.       Specify the kind of trace requested for the execution of the program:
  309.       a    Display the source line numbers.  This requires that the program
  310.            be compiled with the -a option.
  311.       c    Display the name of each routine as it is entered and exited.
  312.       e    Display the name of each exception as it is raised.
  313.       r    Trace each rendezvous.
  314.       s    Display the context-switches between tasks.
  315.       t    Display task creation, activation, and termination.
  316.  
  317. Examples
  318.  
  319. The following examples show typical usage:
  320.  
  321. 1.   Compile T1.ADA into a new library called TSTLIB and bind the library,
  322.      and then execute it. The listing is written to T1.LST. The -s option
  323.      is used to force a listing file to be created.
  324.  
  325.         adacomp  -s  -n  -l  tstlib  -b   t1
  326.         adaexec  -l tstlib
  327.  
  328. 2.   Compile a package specification in P.SPC and the corresponding body
  329.      in P.BOD, into a new library called TSTLIB. Then compile T2.ADA into
  330.      the same library, bind the main program, and then execute it.
  331.  
  332.         adacomp  -n  -l  tstlib  p.spc
  333.         adacomp  -l  tstlib  p.bod
  334.         adacomp  -l  tstlib  -b  t2
  335.         adaexec  -l tstlib
  336.  
  337. 3.   In the example above, the binding could be done in a separate phase.
  338.      This is achieved by replacing the third command above with:
  339.  
  340.         adacomp -l  tstlib t2
  341.         adabind -l tstlib
  342.  
  343. 4.   Example 2 above could be done without explicitly specifying the
  344.      library by defining the environment symbol adalib as follows:
  345.  
  346.         set  adalib=c:\mylib
  347.         adacomp  -n  p.spc
  348.         adacomp  p.bod
  349.         adacomp  -b t2
  350.         adaexec
  351.  
  352. 5.   Compile a program with line numbers included in the generated code.
  353.      Execute it displaying source line numbers as they are encountered.
  354.  
  355.         adacomp  -a  -l  -b  tstlib   t1
  356.         adaexec  -t  a  -l tstlib
  357.  
  358. 6.   Compile a program with two parameterless procedures (potential main
  359.      programs) which are named MAIN1 and MAIN2 and bind the library TSTLIB
  360.      using MAIN1 as the main program.
  361.  
  362.         adacomp  -n  -l  tstlib p1
  363.         adacomp  -l  tstlib p2
  364.         adabind  -m  main1 -l tstlib
  365.         adaexec  -l tstlib
  366.  
  367. 7.   Suppose we wish to add another program to the library TSTLIB (created
  368.      in Example 6) whose main program unit is named MAIN3 and appears in
  369.      file P3.ADA.  The following commands will compile and execute MAIN3.
  370.      As TSTLIB was previously bound with MAIN1 as a main unit, it is now
  371.      necessary to use the -m option on the adaexec command in order to
  372.      select the desired bound main unit.
  373.  
  374.         adacomp  -l  tstlib  p3
  375.         adabind  -m  main3  -l tstlib
  376.         adaexec  -m  main3  -l tstlib
  377.  
  378. 8.   The contents of a library can be examined with:
  379.         adalib  -l tstlib
  380.      Adalib writes to the standard output the name, type and compilation
  381.      date of each compilation unit. In addition, it writes the current
  382.      status (active or obsolete) of each unit.  Units which may be main
  383.      programs are noted by "(Main)"; if there is more than one such unit,
  384.      the -m option of adabind must be specified during binding. Libraries
  385.      that have been bound will contain at least one unit labelled "binding
  386.      unit". If several of those are active, the -m option must be specified
  387.      for adaexec.
  388.  
  389. 9.   The DOS redirection facilities can be used with the adaexec and
  390.      adalib commands. In particular, use with the adaexec command permits
  391.      a program to associate the default input and output files with
  392.      specified files; for example,
  393.         adaexec  -l tstlib  <i.dat  >o.dat
  394.      causes execution of the bound program in library TSTLIB with standard
  395.      input taken from I.DAT and standard output written to O.DAT.  The
  396.      output from adalib may also re redirected.
  397.  
  398.  
  399.  
  400. Diagnostics, Exit Codes and Termination
  401.  
  402. Adaed commands return an exit code of 0 in the case of success, and
  403. nonzero otherwise. An error code of 1 indicates errors in usage of the
  404. Ada language, 2 is returned if there is an internal system error, and
  405. 3 denotes some invalid usage of the system. Error messages regarding
  406. invalid system usage are directed to the standard error file. Ada-language
  407. related messages detected by adacomp are written to the listing file,
  408. while those detected by adabind or adaexec appear on standard output.
  409.  
  410. Note that an error in a given compilation unit may cause subsequent
  411. compilation units (within the same compilation) not to be recognized.
  412.  
  413. Any compilation or execution that terminates abnormally with the error
  414. message "capacity limit exceeded" indicates a program l error" has uncovered a bug that should be
  415. reported to the NYU Ada group (adaed@cs.nyu.edu).
  416.  
  417. 6. APPENDIX F
  418.  
  419.     (1)  The form, allowed places, and effect of implementation dependent
  420.          pragmas.
  421.  
  422.        NYU Ada/Ed does not recognize any implementation dependent pragmas.
  423.        The language  defined  pragmas  are  correctly recognized and their
  424.        legality is checked, but, with the exception of LIST, PRIORITY, and
  425.        INTERFACE they  have  no  effect  on  the execution of the program. 
  426.        A warning message  is  generated  to  indicate  that  the  pragma  
  427.        is ignored by Ada/Ed.
  428.  
  429.     (2)  The name and the type of every implementation dependent attribute.
  430.  
  431.        There are no implementation dependent attributes in NYU Ada/Ed.
  432.  
  433.     (3)  The specification of the package system (see 13.7).
  434.  
  435.  
  436.              package SYSTEM is
  437.  
  438.                 type SEGMENT_TYPE is new INTEGER range 0..255;
  439.                 type OFFSET_TYPE  is new INTEGER range 0..32767;
  440.                 type ADDRESS is record
  441.                    SEGMENT: SEGMENT_TYPE := SEGMENT_TYPE'LAST;
  442.                    OFFSET: OFFSET_TYPE := OFFSET_TYPE'LAST;
  443.                 end record;
  444.  
  445.                 type NAME    is (ELXSI_BSD, ELXSI_ENIX, PC_DOS, 
  446.                                    SUN_UNIX, VAX_UNIX, VAX_VMS) ; 
  447.  
  448.                 SYSTEM_NAME  : constant NAME := PC_DOS;
  449.  
  450.                 STORAGE_UNIT    : constant  :=  8;
  451.                 MEMORY_SIZE     : constant  :=  2**16 - 1;
  452.  
  453.                 -- System Dependent Named Numbers:
  454.  
  455.                 MIN_INT         : constant  :=  -2**31;
  456.                 MAX_INT         : constant  :=  2**31 - 1;
  457.                 MAX_DIGITS      : constant  :=  6;
  458.                 MAX_MANTISSA    : constant  :=  31;
  459.                 FINE_DELTA      : constant  :=  2.0 ** (-30);
  460.                 TICK            : constant  :=  0.01;
  461.  
  462.                 -- Other System Dependent Declarations
  463.  
  464.                 subtype PRIORITY is INTEGER range 0 .. 4;
  465.  
  466.                 SYSTEM_ERROR  :  exception;
  467.                                 -- raised if internal check fails
  468.  
  469.              end SYSTEM;
  470.  
  471.  
  472.     (4)  The list of all restrictions on representation clauses (see 13.1).
  473.  
  474.        NYU Ada/Ed supports the representation clauses for SMALL for
  475.        fixed points specifying powers of 2 and 10.  NYU Ada/Ed  supports 
  476.        no other representation  clauses,  and  a  program containing any
  477.        instance of any representation clause is  considered to be illegal.
  478.  
  479.     (5)  The  conventions  used  for  any   implementation-generated  name
  480.          denoting  implementation-dependent  components (see 13.4).
  481.  
  482.        NYU Ada/Ed  does  not  provide  any system generated names denoting
  483.        system   dependent  entities,  since  in  any case,  representation
  484.        specifications  are not permitted.
  485.  
  486.     (6)  The interpretation of expressions that appear in address clauses.
  487.  
  488.        Addresses  in  NYU  Ada/Ed  are  fully  supported. The ADDRESS type
  489.        defined in the package SYSTEM is a record consisting of two fields.
  490.        The  first  is  an unsigned byte which contains the segment number.
  491.        The  second  is  the  offset  within  the  segment,  ranging from 0
  492.        to 32767.
  493.  
  494.     (7)  Any restriction on unchecked conversions (see 13.10.2).
  495.  
  496.        NYU Ada/Ed will correctly recognize and check the validity  of  any
  497.        use  of unchecked  conversion.  However, any program which executes
  498.        an  unchecked  conversion  is  considered to be erroneous, and  the
  499.        exception  PROGRAM_ERROR  will be raised.
  500.  
  501.     (8)  Any implementation-dependent characteristics of the  input-output
  502.          packages (see 14).
  503.  
  504.        A) Temporary files are fully supported. The names are generated 
  505.           using the "tmpnam" C library function and therefore will not 
  506.           interfere with any existing file.
  507.  
  508.        B) Deletion of files is fully supported.
  509.  
  510.        C) Only one internal file may be associated  with the same external
  511.           file (No multiple accessing of files allowed).
  512.  
  513.        D) File names used in the CREATE and OPEN procedures  are  standard
  514.           Unix file names.  The  function FORM returns the string given as
  515.           FORM  parameter  when  a  file  is  created. No system-dependent
  516.           characteristics  are  associated  with that parameter.
  517.  
  518.        E) A  maximum  of  20  files  can  be open at any given time during
  519.           program execution.
  520.  
  521.        F) The  standard  input file is  stdin; the  standard  output  file
  522.           is stdout.
  523.  
  524.        G) SEQUENTIAL_IO  and  DIRECT_IO  support  constrained array types,
  525.           record  types  without  discriminants  and  record  types  with
  526.           discriminants with defaults. SEQUENTIAL_IO and DIRECT_IO are not
  527.           supported for unconstrained types.
  528.  
  529.        H) I/O on  access types is possible, but  usage  of  access  values
  530.           read  in  another program execution is erroneous.
  531.  
  532.        I) Normal termination of the main  program  causes  all  open files
  533.           to  be closed, and all temporary files to be deleted.
  534.  
  535.        J) LOW_LEVEL_IO is not supported.
  536.  
  537.        K) The  form  feed  character  (ASCII.FF)  is  used  as  the  page
  538.           terminator  indicator.  Its  use as a data element of a file is
  539.           therefore undefined.
  540.  
  541.     (9)  The Implementation Limitations.
  542.  
  543.        The maximum identifier length (number of characters):   120
  544.        The maximum number of characters in a source line:      120
  545.        The maximum number of lines in a source file:         32767
  546.  
  547.        Generic  declarations  and  their corresponding bodies must appear
  548.        in the same compilation. Subunits of a generic must be part of the
  549.        same compilation (see 10.3(9)).
  550.  
  551.  
  552.